package org.larkdoc.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 命名驼峰转换工具类
 * 
 * @author  zhangpeijun[zhangpeijun1024@qq.com]
 * @version  [v1.0.1, 2017年10月17日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class HumpConverter {
    
    private static Pattern linePattern = Pattern.compile("_(\\w)");
    
    private static Pattern humpPattern = Pattern.compile("[A-Z]");
    
    /**
     * @Title: 	lineToHump   
     * @author 	zhangpeijun
     * @Desc: 	TODO 下划线转驼峰
     * @time:	2016 2016年9月9日 下午1:39:10 
     * @param: 	@param str
     * @param: 	@return
     * @return: String
     */
    public static String lineToHump(String str) {
        str = str.toLowerCase();
        Matcher matcher = linePattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
    
    /**
     * @Title: 	humpToLine   
     * @author 	zhangpeijun
     * @Desc: 	TODO 驼峰转下划线
     * @time:	2016 2016年9月9日 下午1:39:01 
     * @param: 	@param str
     * @param: 	@return
     * @return: String
     */
    public static String humpToLine(String str) {
        Matcher matcher = humpPattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
//        return humpToSplit(str, "_");
        return sb.toString();
    }
    
    /**
     * 驼峰命名转指定分隔符的命名方式
     * @param str 带替换字符串
     * @param split 分隔符
     * @return [参数说明]
     * 
     * @return String [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    public static String humpToSplit(String str, String split) {
        Matcher matcher = humpPattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, split + matcher.group(0).toLowerCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }
}
